﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Core.Message.Entities;
using Core.ExceptionHandling;
using Core.Controls.Message;
using vHCS.TS.Entities;
using vHCS.TS.Business;
using vHCS.HR.Business;
using vHCS.SYS.Business;
using Telerik.Web.UI;
using System.Collections.ObjectModel;
using Core.NTier.Entities;
using Core.Common.Session;
using System.IO;
using System.Data;
using System.Configuration;


#region K2 process

#endregion

namespace vHCS.K2App.MdlK2
{
    /// <summary>
    /// Đăng ký ngoài giờ
    /// </summary>
    public partial class TS_RegisteredOT : Core.NTier.UserInterface.BaseFormNotPer
    {
        /// <summary>
        /// khai báo biến
        /// </summary>
        private string curDate = DateTime.Now.ToString("MM/yyyy");
        public DataTable dtListProject = new DataTable();
        private string _CHUAGUI = "1";
        //private static RadAjaxManager ajax = new RadAjaxManager();

        /// <summary>
        /// sự kiện page load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                txtMonth.Text = curDate; //set default tháng/năm hiện hành  
                // truong hop lan dau load form thi hien thi thong tin cua userdomain
                if (this.hdfempID.Value == "" || this.hdfempID.Value == null)
                {
                    //Hiển thị thông tin user hiện tại                
                    this.ucEmpHeader.LoadEmpInfo(SessionManager.UserDomain);

                    // lấy thông tin EmpID nhân viên
                    this.hdfempID.Value = ucEmpHeader.EmployeeId.ToString();

                    GetDataOTByEmpID();

                    hdfIsSave.Value = "1";
                }
                ClientScript.RegisterStartupScript(Page.GetType(), "LoadMaximize", "LoadMaximize();", true);
            }            
        }

        /// <summary>
        /// sự kiện chọn tên đăng nhập
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void HR_ctrEmpHeader_OnUserChanged(object sender, EventArgs e)
        {
            this.hdfempID.Value = this.ucEmpHeader.EmployeeId.ToString();
            GetDataOTByEmpID();
            this.dataList.CacheClear();
            this.dtgList.Rebind();
        }

        /// <summary>
        /// lấy thông tin danh sách dự án theo nhân viên và tháng/năm
        /// </summary>
        private void GetDataOTByEmpID()
        {
            TS_OverTimeCollection col = new TS_OverTimeCollection();            
            long lngEmpID = 0;
            long.TryParse(hdfempID.Value, out lngEmpID);
            if (lngEmpID > 0 && txtMonth.Text != "")
            {
                dtListProject = col.GetListProjectByEmpID(txtMonth.Text, lngEmpID); // lấy danh sách dự án                
                dataList.SelectParameters["Row"].DefaultValue = "1";
                dataList.SelectParameters["Status"].DefaultValue = "AddNew";
            }
        }

        /// <summary>
        /// load comboProject khi chọn combo ngày
        /// </summary>
        /// <param name="cboProject"></param>
        public void loadComboProject(RadComboBox cboOT, RadComboBox cboProject)
        {
            cboProject.SelectedIndex = 0;

            //Load danh sách dự án
            TS_OverTimeCollection col = new TS_OverTimeCollection();
            cboProject.DataSource = col.GetComboItemProject(cboOT.SelectedValue, long.Parse(hdfempID.Value.ToString()), true);
            cboProject.DataTextField = "Name";
            cboProject.DataValueField = "ID";
            cboProject.DataBind();
        }

        /// <summary>
        /// Chuyển đổi định dạng MM/yyyy thành DateTime
        /// </summary>
        /// <param name="strDateTime">Chuỗi tháng năm</param>
        /// <param name="split">Ký tự dùng để split</param>
        /// <returns>Datetime</returns>
        public DateTime convertMMyyyytoDateTime(string strDateTime, char[] split)
        {
            DateTime dt = new DateTime();
            try
            {
                string[] listDateTime = strDateTime.Split(split);
                //Ngày mặc định là 1
                dt = new DateTime(int.Parse(listDateTime[1]), int.Parse(listDateTime[0]), 1);
            }
            catch (Exception ex)
            {
                BusinessLogicExceptionHandler.HandleExcetion(ex);
            }
            return dt;
        }

        /// <summary>
        /// Chuyển đổi định dạng hh:mm thành DateTime
        /// </summary>
        /// <param name="strDateTime">Chuỗi giờ</param>
        /// <param name="split">Ký tự dùng để split</param>
        /// <returns>Datetime</returns>
        public DateTime converthhmmtoDateTime(string strDateTime, char[] split)
        {
            DateTime dt = DateTime.Today;
            try
            {
                string[] listDateTime = strDateTime.Split(split);
                TimeSpan sp = new TimeSpan(int.Parse(listDateTime[0]), int.Parse(listDateTime[1]), 1);
                DateTime result = dt.Add(sp);
                return result;
            }
            catch (Exception ex)
            {
                BusinessLogicExceptionHandler.HandleExcetion(ex);
            }
            return dt;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        protected List<TS_OverTimeBL> CreateListString()
        {
            List<TS_OverTimeBL> lstInfo = new List<TS_OverTimeBL>();
            try
            {
                for (int i = 0; i < dtgList.Items.Count; i++)
                {
                    TS_OverTimeBL bl = new TS_OverTimeBL();
                    GridDataItem item = (GridDataItem)dtgList.Items[i];
                    CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);

                    if (check.Checked == true && check.Visible == true) // chỉ thực hiện đối với các dòng được check chọn và hiển thị checkbox
                    {
                        // lấy các đối tượng trên lưới
                        RadComboBox cboDateOT = (RadComboBox)item.FindControl("cboDateOT");
                        RadComboBox cboProject = (RadComboBox)item.FindControl("cboProject");
                        RadTextBox txtTimeIn = (RadTextBox)item.FindControl("txtTimeIn");
                        RadTextBox txtTimeOut = (RadTextBox)item.FindControl("txtTimeOut");
                        RadNumericTextBox txtMidShift = (RadNumericTextBox)item.FindControl("txtMidShift");
                        RadNumericTextBox txtTotal = (RadNumericTextBox)item.FindControl("txtTotal");
                        TextBox txtNote = (TextBox)item.FindControl("txtNote");
                        CheckBox chkNghiBu = (CheckBox)item.FindControl("chkNghiBu");
                        RadTextBox txtLSShift = (RadTextBox)item.FindControl("txtLSShiftID");
                        RadTextBox txtTypeDate = (RadTextBox)item.FindControl("txtTypeDate");
                        RadTextBox txtLSScheduleID = (RadTextBox)item.FindControl("txtLSScheduleID");

                        long lngOverTimeID = 0;
                        long.TryParse(item["OverTimeID"].Text, out lngOverTimeID);

                        // gán các thông tin của object vào TS_OverTimeBL
                        bl.OverTimeID = long.Parse(item["OverTimeID"].Text);
                        bl.EmpID = long.Parse(hdfempID.Value);
                        bl.MonthYear = Convert.ToDateTime(item["MonthYear"].Text);
                        //DateTime dt = convertMMyyyytoDateTime(txtMonth.Text.Trim(), new char[] { '/' });
                        //bl.MonthYear = dt; // tháng/năm OT
                        bl.DateID = Convert.ToDateTime(cboDateOT.SelectedValue); // ngày OT
                        bl.TimeIn = converthhmmtoDateTime(txtTimeIn.Text.Trim(), new char[] { ':' }); // giờ vào
                        bl.TimeOut = converthhmmtoDateTime(txtTimeOut.Text.Trim(), new char[] { ':' }); // giờ ra
                        if (!String.IsNullOrEmpty(txtMidShift.Text))
                            bl.NumOfBreak = float.Parse(txtMidShift.Text.Trim()); // giữa ca
                        if (!String.IsNullOrEmpty(txtTotal.Text))
                            //bl.TotalOTHours = float.Parse(txtTotal.Text.Trim()); // tổng giờ OT
                            bl.TotalOTHours = txtTotal.Value.Value; // tổng giờ OT
                        if (!String.IsNullOrEmpty(cboProject.SelectedValue))
                            bl.ProjectID = long.Parse(cboProject.SelectedValue); // dự án
                        bl.Note = txtNote.Text; // ghi chú
                        chkNghiBu.Enabled = true;
                        bl.IsCompensation = chkNghiBu.Checked;
                        bl.StatusID = long.Parse(_CHUAGUI); // set tình trạng default chưa gửi
                        if (!String.IsNullOrEmpty(txtLSShift.Text))
                            bl.LSShiftID = long.Parse(txtLSShift.Text); // loại ca làm việc
                        if (!String.IsNullOrEmpty(txtTypeDate.Text))
                            bl.TypeDate = int.Parse(txtTypeDate.Text); // loại ngày
                        if (!String.IsNullOrEmpty(txtLSScheduleID.Text))
                            bl.LSScheduleID = long.Parse(txtLSScheduleID.Text); // loại lịch làm việc
                        lstInfo.Add(bl);
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
            return lstInfo;
        }

        /// <summary>
        /// sự kiện click nút Lưu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                List<TS_OverTimeBL> lstInfo = new List<TS_OverTimeBL>();
                lstInfo = CreateListString();

                if (lstInfo.Count > 0)
                {
                    TS_OverTimeCollection cls = new TS_OverTimeCollection();
                    int result = cls.Save_K2(lstInfo);
                    if (result == 0)
                    {
                        MessageBox.ShowByMessCode("12478", MessageType.Successful); // thông báo cập nhật ko thành công                        
                    }

                    else if (result == 1)
                    {
                        MessageBox.ShowByMessCode("10010", MessageType.Successful); // thông báo cập nhật thành công                                                
                    }

                    else if (result == 2)
                    {
                        MessageBox.ShowByMessCode("12479", MessageType.Successful); // thông báo cập nhật thành công. Một số trường hợp ko cập nhật được                                            
                    }
                    btnSearch_Click(null, null);
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút Gửi duyệt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                string strContentOT = string.Empty;
                string strOverTimeID = string.Empty;
                string OverTimeID = string.Empty;
                long lngEmpID = 0;
                long.TryParse(hdfempID.Value.ToString(), out lngEmpID);

                strContentOT += "<br/>Over time request content:";
                strContentOT += "<table border='0' cellpadding='2' style='text-align: left; font-family:arial; font-size: 10pt;'><tbody>";
                strContentOT += "<tr>";
                strContentOT += "<th stype='width:60px; padding-left:15px;'>Date</th>";
                strContentOT += "<th type='width:250px; padding-left:15px;'>Description&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp</th>";
                strContentOT += "<th type='width:60px; padding-left:15px;'>Start Time</th>";
                strContentOT += "<th type='width:60px; padding-left:15px;'>End Time</th>";
                strContentOT += "<th type='width:60px; padding-left:15px;'>Total(hours)</th>";
                strContentOT += "</tr>";
                // duyệt các dòng gửi duyệt OT xem có bao nhiêu project -> có bao nhiêu projectlead và có gửi duyệt cho reportingline ko
                for (int i = 0; i < dtgList.Items.Count; i++)
                {
                    GridDataItem item = (GridDataItem)dtgList.Items[i];
                    CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);

                    if (check.Visible && check.Checked)
                    {
                        OverTimeID = (item["OverTimeID"].Text == "&nbsp;" ? "0" : item["OverTimeID"].Text);
                        strOverTimeID += OverTimeID + "@";

                        strContentOT += "<tr>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + ((RadComboBox)item.FindControl("cboDateOT")).SelectedValue + "</td>";
                        strContentOT += "<td stype='width:250px;padding-left:15px; vertical-align:top;'>" + ((TextBox)item.FindControl("txtNote")).Text + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + ((RadTextBox)item.FindControl("txtTimeIn")).Text + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + ((RadTextBox)item.FindControl("txtTimeOut")).Text + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + ((RadNumericTextBox)item.FindControl("txtTotal")).Text + "</td>";
                        strContentOT += "</tr>";
                    }
                }
                strContentOT += "</tbody></table>";


                if (string.IsNullOrEmpty(strOverTimeID)) // chưa chọn dòng OT nào để gửi duyệt
                {
                    MessageBox.ShowByMessCode("10263", MessageType.Warning);
                    return;
                }
                else
                {
                    #region thực hiện gửi duyệt hàng loạt
                    TS_OverTimeCollection col = new TS_OverTimeCollection();
                    ExcuteK2(lngEmpID, strOverTimeID, strContentOT);
                    long result = col.UpdateByList(strOverTimeID);
                    if (result > 0)
                    {
                        // thông báo gửi duyệt thành công
                        MessageBox.ShowByMessCode("10182", MessageType.Successful);

                        this.dataList.CacheClear();
                        this.dtgList.Rebind();
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút Lưu & gửi duyệt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSaveSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                long lngEmpID = 0;
                long.TryParse(hdfempID.Value.ToString(), out lngEmpID);
                string strContentOT = string.Empty;
                // ghép chuỗi các dòng thao tác
                List<TS_OverTimeBL> lstInfo = new List<TS_OverTimeBL>();
                lstInfo = CreateListString();

                if (lstInfo.Count > 0)
                {
                    strContentOT += "<br/>Over time request content:";
                    strContentOT += "<table border='0' cellpadding='2' style='text-align: left; font-family:arial; font-size: 10pt;'><tbody>";
                    strContentOT += "<tr>";
                    strContentOT += "<th stype='width:60px; padding-left:15px;'>Date</th>";
                    strContentOT += "<th type='width:250px; padding-left:15px;'>Description&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp</th>";
                    strContentOT += "<th type='width:60px; padding-left:15px;'>Start Time</th>";
                    strContentOT += "<th type='width:60px; padding-left:15px;'>End Time</th>";
                    strContentOT += "<th type='width:60px; padding-left:15px;'>Total(hours)</th>";
                    strContentOT += "</tr>";
                    foreach (TS_OverTimeBL item in lstInfo)
                    {
                        strContentOT += "<tr>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + item.DateID.ToShortDateString() + "</td>";
                        strContentOT += "<td stype='width:250px;padding-left:15px; vertical-align:top;'>" + item.Note + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + item.TimeIn.ToString("HH:mm") + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + item.TimeOut.ToString("HH:mm") + "</td>";
                        strContentOT += "<td stype='width:60px;padding-left:15px; vertical-align:top;'>" + item.TotalOTHours + "</td>";
                        strContentOT += "</tr>";
                    }
                    strContentOT += "</tbody></table>";

                    TS_OverTimeCollection cls = new TS_OverTimeCollection();

                    // lưu thông tin OT
                    string strOverTimeID = cls.SaveSubmit_K2(lstInfo);

                    // thực thi K2
                    ExcuteK2(lngEmpID, strOverTimeID, strContentOT);

                    // gửi duyệt thông tin OT
                    if ((strOverTimeID.Split('@')).Length > 0)
                    {
                        long result = cls.UpdateByList(strOverTimeID);
                        if (result > 0)
                        {
                            // thông báo gửi duyệt thành công
                            MessageBox.ShowByMessCode("10182", MessageType.Successful);

                            this.dataList.CacheClear();
                            this.dtgList.Rebind();
                        }                            
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// DungN2
        /// Xử lý gửi duyệt trong K2
        /// </summary>
        /// <param name="EmpID"></param>
        /// <param name="strOverTimeID"></param>
        public void ExcuteK2(long EmpID,string strOverTimeID, string strContentOT)
        {
            string logcontent = "";
            try
            {
                #region xử lý liên quan K2
                //lấy danh sách projectID và approveUser (projectlead or reportingline)
                string[] ListOTID=new string[]{};
                TS_OverTimeCollection cls = new TS_OverTimeCollection();
                DataTable dt = new DataTable();
                dt = cls.GetListUserApprove(EmpID, "@" + strOverTimeID, txtMonth.Text.ToString());

                if (dt.Rows.Count <= 0)
                {
                    MessageBox.ShowByMessCode("10264", MessageType.Warning);
                    return;
                }

                // duyệt qua có bao nhiêu userapprove thì start bấy nhiêu process
                //Active Process K2

                string UserApprover = string.Empty;

                string OTID_All = "";

                #region Lấy thông tin OT ID
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    OTID_All += "," + dt.Rows[i]["OverTimeID"].ToString().Trim(',');
                }
                #endregion

                #region Xử lý gửi mail cho Requester
                vHCS.SYS.Business.SYS_MailTemplateCollection cl_nextapprove = new vHCS.SYS.Business.SYS_MailTemplateCollection();
                //SYS_MailTemplateBL MailReqDTO = cl_nextapprove.FindByCode("TS_OverTime_Request");
                //string MailContent_Request = MailReqDTO.ContentVN;
                //string MailSubject_Request = MailReqDTO.TitleVN;
                //// Adding Mail Signal
                //string signal = cl_nextapprove.FindByCode("SIGNATURE").ContentVN;
                //MailContent_Request += signal;
                ////Gán nội dung mail gửi request
                //MailContent_Request = MailContent_Request.Replace("$RequestDate$", DateTime.Now.ToShortDateString());
                //MailContent_Request = MailContent_Request.Replace("$url$", ConfigurationManager.AppSettings.Get("History_OT") + OTID_All.Trim(',') + "&EmpID=" + EmpID.ToString());

                string EmailRequester = SessionManager.UserDomain;
                #endregion

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    UserApprover = dt.Rows[i]["UserID"].ToString();
                    string OTID = dt.Rows[i]["OverTimeID"].ToString().Trim(',');

                    #region Xử lý gửi mail cho approver
                     string EmailApprover = UserApprover;

                    ////Gán thông tin mail content
                    //MailApprover_Content = cl_nextapprove.ReturnMailContent("TS_OverTime_NextApprove");
                    //MailApprover_Content = MailApprover_Content.Replace("$Creator$", SessionManager.UserDomain);
                    //MailApprover_Content = MailApprover_Content.Replace("$url$", ConfigurationManager.AppSettings.Get("LinkOverTimeApprove_Old"));
                    ////Gán thông tin mail subject
                    //MailApprover_Subject = cl_nextapprove.ReturnSubjectMail("TS_OverTime_NextApprove");
                    //MailApprover_Subject = MailApprover_Subject.Replace("$Creator$", SessionManager.UserDomain);
                    string viewHistoryOTLink = ConfigurationManager.AppSettings.Get("History_OT");
                    string approveOTLink = ConfigurationManager.AppSettings.Get("LinkOverTimeApprove_Old");

                    //EmailApprover = EmailApprover;
                    #endregion

                    int iTypeID = K2CoreLib.K2Utils.GetTypeIDProcessFromEfrom("HR_OverTime");
                    string sLinkContent = ConfigurationManager.AppSettings.Get("History_OT") + OTID + "&EmpID=" + EmpID.ToString();
                    string status = "0"; //(0: In process, 1: Complete, 2: Rework, 3:Reject)
                    string eformid = K2CoreLib.K2Utils.submit2EForm(SessionManager.UserDomain, SessionManager.UserDomain, iTypeID, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), sLinkContent, status,ucEmpHeader.Username);
                    string[] lst_eformid = eformid.Split(',');

                    logcontent = "EmpID = " + ucEmpHeader.EmployeeId.ToString() + "; " +
                        "User Approve=" + UserApprover + "; " +
                        "User Authenticated =" + SessionManager.UserDomain + "; " +
                        "Month=" + txtMonth.Text.Trim() + "; " +
                        "ProcessID=" + lst_eformid[1].ToString() + "; " +
                        "ProcessCode=" + lst_eformid[0].ToString() + "; " +
                        "EmailApprover=" + EmailApprover + "; " +
                        "EmailRequester=" + EmailRequester + "; ";

                    //Lấy thông tin thời gian expire
                    string ExpireDay = ConfigurationManager.AppSettings.Get("OT_ExpireDay");
                    string ExpireAlert = ConfigurationManager.AppSettings.Get("OT_ExpireAlert");

                    int proid = K2CoreLib.K2Utils.StartOTProcess(ucEmpHeader.EmployeeId.ToString(), UserApprover, SessionManager.UserDomain, txtMonth.Text.Trim(), OTID, lst_eformid[1], lst_eformid[0],
                        EmailApprover, EmailRequester, viewHistoryOTLink, approveOTLink, strContentOT,"",ucEmpHeader.Username,ExpireDay,ExpireAlert);

                    if (proid <= 0)
                    {
                        BusinessLogicCustomException ex = new BusinessLogicCustomException("12615");
                        throw ex;
                    }

                    K2CoreLib.K2Utils.Update2EForm("0", lst_eformid[1], proid.ToString());

                    ListOTID = OTID.Split(',');
                    foreach (string id in ListOTID)
                    {
                        cls.InsertProcessID(Convert.ToInt64(string.IsNullOrEmpty(id) ? "0" : id), lst_eformid[1]);
                    }
                    logcontent += ";ProcessStart=" + proid;
                }

                #region begin to save history
                HR_WorkingRecordCollection cl_his = new HR_WorkingRecordCollection();
                cl_his.InsertHistory(Convert.ToInt64(ListOTID[0]), DateTime.Now, SessionManager.UserDomain, "Requester", "Submitted", "", 3, 0);
                #endregion End save
                //End Process K2
                ClientScript.RegisterStartupScript(Page.GetType(), "ClosePage", "ClosePage();", true);
                #endregion
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
                throw ex;
            }
            finally
            {
                try
                {
                    SaveLog(logcontent);
                }
                catch { }
            }
        }

        public void SaveLog(string content)
        {

            try
            {
                using (StreamWriter writer = new StreamWriter(Server.MapPath("../"+ConfigurationManager.AppSettings.Get("LogFile")), true))
                {

                    writer.WriteLine();

                    writer.WriteLine(DateTime.Now.ToString());

                    writer.WriteLine("Over Time");

                    writer.WriteLine(content);

                    writer.Close();

                }
            }

            catch (Exception x)
            {

                throw x;

            }

        }
        /// <summary>
        /// sự kiện click nút Tìm kiếm
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            try
            {
                hdfIsSave.Value = "0";
                TS_OverTimeCollection col = new TS_OverTimeCollection();
                long lngEmpID = 0;
                long.TryParse(hdfempID.Value, out lngEmpID);
                dtListProject = col.GetListProjectByEmpID(txtMonth.Text, lngEmpID); // lấy danh sách dự án                
                dataList.SelectParameters["Row"].DefaultValue = "0";                
                dataList.SelectParameters["Status"].DefaultValue = "AddNew";
                this.dataList.CacheClear();
                this.dtgList.Rebind();
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút Làm mới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnRefesh_Click(object sender, EventArgs e)
        {
            try
            {
                this.Response.Redirect("TS_RegisteredOT.aspx");
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// Xóa thông tin ngoài giờ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                hdfIsSave.Value = "0";
                long[] arr_ID = CreateStringID();

                // thực hiện thao tác xóa                
                if (arr_ID.Length > 0)
                {
                    TS_OverTimeCollection col = new TS_OverTimeCollection();
                    long result = col.DeleteByList(arr_ID);
                    if (result > 0)
                    {
                        // thông báo xóa thành công
                        MessageBox.ShowByMessCode("10001", MessageType.Successful);

                        this.dataList.CacheClear();
                        this.dtgList.Rebind();
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// ghép chuỗi thông tin ID
        /// </summary>
        /// <returns></returns>
        private long[] CreateStringID()
        {
            //Kiểm tra check chọn
            if (dtgList.SelectedItems == null || dtgList.SelectedItems.Count == 0)
                MessageBox.ShowByMessCode("10003", MessageType.Warning);

            // duyệt từng dòng check chọn trên lưới
            long[] arr_ID = new long[dtgList.SelectedItems.Count];
            for (int i = 0; i < dtgList.SelectedItems.Count; i++)
            {
                GridDataItem item = (GridDataItem)dtgList.SelectedItems[i];
                CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);
                if (check.Visible == true) // chỉ thực hiện ghép chuỗi đối với các dòng có hiện check box
                {
                    string strID = item["OverTimeID"].Text.ToString().Trim();
                    long lngID = long.Parse(string.IsNullOrEmpty(strID) ? "0" : strID);
                    arr_ID[i] = lngID;
                }
            }
            return arr_ID;
        }

        /// <summary>
        /// write dữ liệu khi form load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgList_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            try
            {
                if (e.Item is GridDataItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;

                    // lấy các đối tượng trên lưới
                    RadComboBox cboDateOT = (RadComboBox)item.FindControl("cboDateOT"); // ngày OT
                    RadComboBox cboProject = (RadComboBox)item.FindControl("cboProject"); // dự án

                    RadTextBox txtTimeIn = (RadTextBox)item.FindControl("txtTimeIn"); // giờ vào
                    RadTextBox txtTimeOut = (RadTextBox)item.FindControl("txtTimeOut"); // giờ ra

                    RadNumericTextBox txtMidShift = (RadNumericTextBox)item.FindControl("txtMidShift"); // nghỉ giữa ca
                    RadNumericTextBox txtTotal = (RadNumericTextBox)item.FindControl("txtTotal"); // tổng giờ đã đăng ký

                    TextBox txtNote = (TextBox)item.FindControl("txtNote"); // ghi chú
                    CheckBox chkNghiBu = (CheckBox)item.FindControl("chkNghiBu");

                    // các thông tin liên quan đến ngày OT
                    RadTextBox txtLSShiftID = (RadTextBox)item.FindControl("txtLSShiftID");
                    RadTextBox txtTypeDate = (RadTextBox)item.FindControl("txtTypeDate");
                    RadTextBox txtLSScheduleID = (RadTextBox)item.FindControl("txtLSScheduleID");
                    RadTextBox txtShiftIn = (RadTextBox)item.FindControl("txtShiftIn");
                    RadTextBox txtShiftOut = (RadTextBox)item.FindControl("txtShiftOut");

                    // ghi thông tin ngoài giờ vào các đối tượng trên lưới
                    if (item["TimeIn"].Text != "&nbsp;")
                        txtTimeIn.Text = Convert.ToDateTime(item["TimeIn"].Text).ToString("HH:mm");
                    if (item["TimeOut"].Text != "&nbsp;")
                        txtTimeOut.Text = Convert.ToDateTime(item["TimeOut"].Text).ToString("HH:mm");
                    if (item["NumOfBreak"].Text != "&nbsp;")
                        txtMidShift.Text = item["NumOfBreak"].Text;
                    if (item["TotalOTHours"].Text != "&nbsp;")
                        txtTotal.Value = Convert.ToDouble(item["TotalOTHours"].Text.ToString().Trim());
                    if (item["Note"].Text != "&nbsp;")
                        txtNote.Text = item["Note"].Text;
                    if (item["IsCompensation"].Text == "1")
                        chkNghiBu.Checked = true;
                    if (item["LSShiftID"].Text != "&nbsp;")
                        txtLSShiftID.Text = item["LSShiftID"].Text;
                    if (item["TypeDate"].Text != "&nbsp;")
                        txtTypeDate.Text = item["TypeDate"].Text;
                    if (item["LSScheduleID"].Text != "&nbsp;")
                        txtLSScheduleID.Text = item["LSScheduleID"].Text;
                    if (item["BegWorkTime"].Text != "&nbsp;")
                        txtShiftIn.Text = item["BegWorkTime"].Text;
                    if (item["EndWorkTime"].Text != "&nbsp;")
                        txtShiftOut.Text = item["EndWorkTime"].Text;

                    // load thông tin ngày OT và dự án
                    if (item["DateID"].Text != "&nbsp;")
                        cboDateOT.SelectedValue = Convert.ToDateTime(item["DateID"].Text).ToShortDateString();
                    loadComboProject(cboDateOT, cboProject);  // load danh sách dự án theo ngày
                    if (item["ProjectID"].Text != "&nbsp;")
                        cboProject.SelectedValue = item["ProjectID"].Text;

                    // xét trường hợp ko hiển thị check box
                    string isUpate = item["IsUpdate"].Text.ToString();
                    CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);

                    // tiện ích check chọn mặc định những dòng OT ở trạng thái chưa gửi
                    if (item["StatusID"].Text.ToString() == "1") // chưa gửi
                    {
                        check.Checked = true;
                    }
                    else
                    {
                        check.Checked = false;
                    }

                    // được update những dòng OT chưa gửi
                    if (isUpate == "1")
                    {
                        check.Visible = true;
                    }
                    else
                    {
                        check.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// sự kiện click nút Thêm dòng
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void AddRow_Click(object sender, EventArgs e)
        {
            try
            {
                hdfIsSave.Value = "1";
                if (!String.IsNullOrEmpty(txtMonth.Text))
                {
                    TS_OverTimeCollection col = new TS_OverTimeCollection();
                    long lngEmpID = 0;
                    long.TryParse(hdfempID.Value, out lngEmpID);
                    dtListProject = col.GetListProjectByEmpID(txtMonth.Text, lngEmpID); // lấy danh sách dự án                

                    dataList.SelectParameters["empID"].DefaultValue = hdfempID.Value.ToString();
                    dataList.SelectParameters["monthYear"].DefaultValue = txtMonth.Text.ToString();
                    dataList.SelectParameters["Row"].DefaultValue = "1";
                    dataList.SelectParameters["Status"].DefaultValue = "AddNew";
                    dtgList.DataSourceID = dataList.ID;
                    dtgList.DataBind();
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }

        }
    }
}